//package plus.lgx.textsearcher.server;
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.boot.SpringApplication;
//import org.springframework.boot.autoconfigure.SpringBootApplication;
//import org.springframework.boot.context.event.ApplicationStartedEvent;
//import org.springframework.boot.web.server.PortInUseException;
//import org.springframework.context.ApplicationContextException;
//import org.springframework.core.env.PropertySource;
//import plus.lgx.textsearcher.config.SearcherConfig;
//
//import java.awt.*;
//import java.io.IOException;
//import java.net.URI;
//import java.util.Optional;
//
//@Slf4j
//@SpringBootApplication
//public class TextSearcherApplication {
//
//    private int port;
//
//    private final PropertySource<Object> propertySource = new PropertySource<>("serverPort") {
//        @Override public Object getProperty(String name) {
//            return "server.port".equals(name) ? port : null;
//        }
//    };
//
//    public void setPort(int port) {
//        this.port = port;
//    }
//
//    public static final Desktop DESKTOP = Desktop.getDesktop();
//
//    /**
//     * 打开默认浏览器访问页面
//     */
//    public static void openDefaultBrowser(String location) {
//        try {
//            DESKTOP.browse(URI.create(location));
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    public TextSearcherApplication() {}
//
//    public TextSearcherApplication(SearcherConfig config) {
//        setPort(config.port);
//    }
//
//    public void startup() {
//        for (int i = 0; i < 5; i++) {
//            try {
//                SpringApplication app = new SpringApplication(TextSearcherApplication.class);
//                app.addInitializers(applicationContext ->
//                        applicationContext.getEnvironment().getPropertySources().addFirst(propertySource));
//                app.addListeners(event -> {
//                    if (event instanceof ApplicationStartedEvent) {
//                        openDefaultBrowser("http://localhost:" + this.port);
//                    }
//                });
//                app.run();
//                return;
//            } catch (ApplicationContextException e) {
//                if (e.getCause() instanceof PortInUseException) {
//                    log.warn("port is in use: {}", this.port);
//                    this.port++;
//                    continue;
//                }
//                log.error(e.getMessage(), e);
//                return;
//            }
//        }
//    }
//
//}
